Data

I started out by downloading all the advanced passing data from https://stats.nba.com/teams/passing/. Unfortunately this only goes back 6 years, so I am going to have to look at assist data as well. The NBA has been counting assists since the 1940s, but these data are much more subjective. Whether a pass leads to a basket is entirely up to the scorekeepers’ judgement, and there have been some famously questionable assists:

Passing Data Summary

W (mean (SD)) Passes.Made (mean (SD)) Passes.Received (mean (SD)) Ast (mean (SD)) Secondary.Ast (mean (SD)) Potential.Ast (mean (SD)) Ast.Pts.Created (mean (SD))
ATL 40.33 (13.06) 25963.33 (828.32) 25963.00 (828.98) 2034.00 (88.84) 263.00 (46.35) 3998.33 (184.07) 5059.67 (245.15)
BOS 44.33 (10.54) 25005.83 (981.29) 25004.50 (981.30) 1947.00 (167.38) 246.33 (45.57) 3896.17 (303.58) 4834.83 (440.41)
CHA 39.00 (5.37) 24308.33 (1027.09) 24306.83 (1028.23) 1793.83 (92.74) 257.17 (18.32) 3647.67 (214.68) 4507.00 (334.11)
CHI 38.33 (11.36) 24836.17 (987.02) 24835.17 (987.50) 1843.83 (55.76) 224.00 (51.56) 3722.50 (313.23) 4548.50 (159.57)
CLE 43.83 (14.70) 23392.50 (816.93) 23347.67 (828.94) 1811.50 (82.46) 243.83 (48.50) 3528.17 (188.56) 4593.17 (305.88)
DAL 38.33 (10.37) 25387.33 (996.13) 25386.67 (996.23) 1841.00 (92.83) 251.00 (29.43) 3754.33 (187.15) 4650.33 (185.40)
DEN 39.67 (8.91) 23590.33 (1685.63) 23544.83 (1623.96) 1971.33 (174.08) 237.67 (36.22) 3856.33 (131.71) 4890.67 (371.33)
DET 37.00 (5.62) 22949.50 (1586.45) 22948.83 (1586.68) 1754.00 (99.25) 206.67 (28.30) 3573.67 (88.08) 4366.67 (233.98)
GSW 62.00 (8.44) 25030.17 (2637.65) 24979.00 (2612.71) 2302.83 (217.14) 320.83 (60.24) 4215.83 (341.99) 5657.83 (544.78)
HOU 53.83 (7.65) 22465.33 (1730.14) 22464.67 (1730.19) 1824.83 (123.50) 210.67 (19.96) 3718.50 (282.24) 4679.83 (328.04)
IND 46.17 (6.15) 24636.50 (809.49) 24635.50 (809.00) 1819.00 (163.48) 236.83 (37.58) 3756.17 (174.23) 4469.00 (346.21)
LAC 51.17 (5.56) 24422.33 (533.12) 24421.00 (533.05) 1928.33 (88.04) 265.67 (52.30) 3644.17 (325.91) 4771.83 (239.16)
LAL 27.17 (7.76) 23217.50 (1067.20) 23215.67 (1067.21) 1826.67 (230.63) 202.17 (52.30) 3658.17 (323.47) 4481.17 (535.18)
MEM 40.83 (11.89) 25676.17 (859.20) 25675.17 (858.84) 1790.00 (90.99) 275.67 (29.46) 3704.17 (123.62) 4371.50 (236.01)
MIA 43.50 (6.53) 24276.33 (577.63) 24275.00 (577.92) 1789.17 (135.82) 240.00 (42.55) 3713.17 (124.13) 4486.17 (343.32)
MIL 39.00 (14.75) 23836.33 (1058.14) 23835.33 (1058.56) 1924.00 (131.88) 243.17 (16.87) 3747.00 (163.20) 4715.00 (388.58)
MIN 33.17 (10.61) 23528.50 (801.05) 23527.50 (801.32) 1907.83 (93.49) 225.33 (21.48) 3783.83 (305.62) 4670.67 (270.69)
NJN 31.83 (10.46) 24456.67 (1381.55) 24456.17 (1381.91) 1802.00 (110.69) 216.50 (13.98) 3713.83 (94.45) 4537.67 (272.43)
NOH 37.33 (7.31) 23897.83 (1382.52) 23896.17 (1381.58) 1941.50 (208.37) 189.83 (45.18) 3700.67 (179.94) 4773.17 (433.64)
NYK 27.00 (8.27) 26131.33 (2455.30) 26130.33 (2455.82) 1725.83 (99.01) 222.83 (18.38) 3676.17 (264.09) 4259.17 (173.54)
OKC 50.33 (5.43) 20943.67 (903.51) 20942.17 (903.51) 1781.67 (91.78) 173.83 (14.19) 3633.50 (144.54) 4400.83 (221.17)
ORL 29.50 (6.69) 23672.67 (807.24) 23671.83 (807.11) 1853.00 (134.81) 225.33 (28.70) 3847.17 (182.96) 4532.17 (342.47)
PHI 29.67 (17.85) 26818.17 (1494.89) 26817.17 (1493.63) 1928.00 (220.61) 224.33 (48.27) 3976.83 (162.87) 4828.33 (500.07)
PHO 28.83 (11.81) 24133.50 (986.88) 24131.83 (987.50) 1699.00 (144.90) 190.33 (27.17) 3614.33 (153.85) 4237.67 (277.96)
POR 48.67 (5.16) 23165.67 (690.48) 23122.33 (703.77) 1778.33 (112.40) 227.50 (39.43) 3650.50 (254.89) 4462.33 (285.40)
SAC 31.33 (4.41) 23959.00 (1732.21) 23957.50 (1730.95) 1812.50 (205.31) 197.00 (44.14) 3622.50 (282.87) 4441.00 (515.66)
SAS 56.67 (8.07) 26086.83 (1758.87) 26086.50 (1758.34) 1982.33 (68.76) 312.83 (37.49) 3696.83 (250.39) 4846.33 (196.89)
TOR 53.00 (5.02) 23736.67 (1098.70) 23736.33 (1098.86) 1752.17 (242.45) 238.67 (51.63) 3465.17 (292.53) 4403.67 (546.03)
UTA 42.00 (9.90) 27011.67 (1887.76) 27011.33 (1888.15) 1742.67 (205.47) 232.33 (38.22) 3710.17 (183.16) 4424.67 (482.74)
WAS 42.33 (6.19) 23963.50 (1245.55) 23963.00 (1245.80) 2003.17 (84.49) 249.67 (24.30) 3920.17 (101.43) 4929.17 (217.83)

Basic Data Summary

FG (mean (SD)) FGA (mean (SD)) FG% (mean (SD)) 3P (mean (SD)) 3PA (mean (SD)) 3P% (mean (SD)) AST (mean (SD)) STL (mean (SD)) BLK (mean (SD)) TOV (mean (SD)) PF (mean (SD)) PTS (mean (SD))
ATL 3070.30 (508.37) 6924.80 (825.48) 0.44 (0.04) 383.27 (277.66) 1105.15 (751.77) 0.32 (0.06) 1791.01 (257.26) 680.74 (106.48) 411.63 (92.27) 1313.61 (195.71) 1903.14 (272.77) 8103.49 (1151.76)
BOS 3153.38 (608.61) 7101.68 (1075.32) 0.44 (0.05) 399.20 (271.42) 1137.72 (742.89) 0.34 (0.04) 1858.07 (363.49) 663.37 (96.13) 383.72 (86.66) 1315.76 (199.10) 1857.21 (230.01) 8201.21 (1391.84)
CHA 2995.52 (370.57) 6636.59 (720.03) 0.45 (0.02) 441.14 (223.21) 1243.03 (604.26) 0.35 (0.03) 1852.59 (260.47) 628.17 (103.64) 384.03 (69.48) 1158.83 (132.75) 1679.17 (224.48) 7980.97 (908.58)
CHI 3193.53 (359.70) 6984.83 (674.12) 0.46 (0.03) 343.52 (224.55) 979.55 (597.14) 0.33 (0.06) 1917.64 (224.34) 646.98 (88.55) 394.70 (67.34) 1317.35 (223.50) 1838.13 (235.89) 8265.28 (845.09)
CLE 3148.37 (371.90) 6895.78 (743.35) 0.46 (0.02) 384.43 (274.12) 1072.00 (724.17) 0.34 (0.05) 1869.02 (230.22) 624.85 (71.69) 397.54 (96.56) 1253.98 (166.16) 1802.61 (233.79) 8156.14 (800.95)
DAL 3146.67 (331.30) 6847.77 (599.29) 0.46 (0.02) 438.54 (264.72) 1240.97 (721.38) 0.34 (0.04) 1813.82 (240.33) 603.08 (69.70) 380.74 (63.30) 1157.33 (155.53) 1754.49 (220.89) 8292.36 (829.51)
DEN 3350.88 (445.17) 7258.87 (816.21) 0.46 (0.02) 321.04 (257.35) 953.02 (694.43) 0.31 (0.05) 1937.83 (321.36) 700.07 (121.94) 444.20 (86.30) 1348.12 (215.97) 1937.63 (230.95) 8788.00 (1019.78)
DET 3079.06 (554.17) 6984.46 (931.05) 0.44 (0.04) 361.45 (248.32) 1040.80 (676.36) 0.32 (0.05) 1727.14 (263.49) 637.85 (109.30) 398.85 (92.83) 1275.00 (253.42) 1875.13 (235.02) 8052.79 (1203.94)
GSW 3167.40 (620.72) 7169.23 (956.50) 0.44 (0.05) 433.45 (307.14) 1206.53 (762.44) 0.33 (0.05) 1812.63 (372.26) 718.59 (110.57) 414.87 (85.99) 1346.61 (187.43) 1865.42 (242.60) 8247.95 (1458.68)
HOU 3253.38 (386.19) 7059.29 (807.72) 0.46 (0.02) 492.02 (340.98) 1403.00 (927.60) 0.33 (0.05) 1902.98 (249.57) 657.09 (87.32) 417.80 (83.66) 1339.15 (194.01) 1824.08 (240.41) 8506.37 (825.36)
IND 3223.40 (393.49) 6993.12 (775.67) 0.46 (0.02) 350.96 (220.67) 1006.84 (577.89) 0.33 (0.05) 1861.29 (261.47) 666.72 (120.84) 409.09 (56.90) 1336.31 (191.35) 1904.77 (213.42) 8458.69 (843.27)
LAC 3208.82 (359.26) 6934.73 (644.54) 0.46 (0.02) 352.70 (251.46) 1028.85 (657.17) 0.32 (0.05) 1853.57 (254.84) 660.80 (103.79) 429.65 (76.23) 1361.74 (223.67) 1870.49 (206.59) 8308.71 (788.21)
LAL 3216.93 (533.64) 7047.69 (793.17) 0.45 (0.04) 397.15 (246.51) 1156.28 (682.82) 0.32 (0.06) 1894.76 (355.05) 677.61 (101.86) 447.33 (75.05) 1296.63 (224.79) 1810.45 (195.92) 8390.32 (1179.95)
MEM 2895.67 (316.54) 6451.50 (641.86) 0.45 (0.01) 450.33 (163.52) 1296.00 (455.67) 0.35 (0.02) 1693.38 (223.97) 643.38 (80.76) 399.17 (74.17) 1200.62 (134.35) 1706.79 (187.20) 7689.17 (838.67)
MIA 2967.87 (328.95) 6470.29 (682.35) 0.46 (0.02) 480.10 (204.58) 1350.90 (553.07) 0.35 (0.02) 1712.74 (196.02) 614.26 (83.18) 405.58 (62.19) 1220.26 (178.49) 1781.77 (245.45) 7871.10 (818.69)
MIL 3282.69 (394.62) 6995.51 (680.19) 0.47 (0.02) 379.15 (231.44) 1073.97 (626.92) 0.34 (0.04) 1951.35 (255.74) 691.72 (113.10) 395.41 (80.45) 1299.78 (201.87) 1894.73 (222.97) 8428.78 (834.30)
MIN 3031.57 (299.49) 6672.40 (584.98) 0.45 (0.01) 372.40 (176.86) 1089.30 (487.60) 0.34 (0.03) 1847.57 (214.75) 610.83 (84.94) 399.00 (72.78) 1179.90 (162.74) 1750.90 (214.04) 7954.87 (786.83)
NJN 3176.40 (392.90) 7021.29 (677.42) 0.45 (0.02) 315.14 (264.01) 938.63 (725.54) 0.31 (0.05) 1805.94 (246.07) 692.00 (128.76) 435.07 (106.66) 1378.54 (244.99) 1930.40 (266.14) 8295.40 (824.54)
NOH 3018.29 (295.93) 6682.35 (514.43) 0.45 (0.02) 548.29 (169.20) 1540.82 (471.74) 0.36 (0.02) 1762.00 (211.53) 604.24 (58.66) 384.47 (75.17) 1125.94 (81.61) 1657.82 (141.17) 7977.35 (778.37)
NYK 3049.22 (587.60) 6870.47 (935.40) 0.44 (0.04) 402.20 (253.22) 1146.12 (689.76) 0.34 (0.04) 1735.89 (354.50) 645.24 (106.88) 350.41 (75.19) 1320.63 (196.82) 1915.03 (264.70) 7954.90 (1316.47)
OKC 3277.12 (336.03) 7065.94 (720.98) 0.46 (0.02) 404.45 (249.50) 1144.38 (684.46) 0.34 (0.05) 1890.12 (229.24) 716.70 (127.91) 402.61 (75.30) 1321.96 (188.37) 1897.85 (231.22) 8547.33 (746.25)
ORL 3025.53 (342.34) 6635.53 (675.45) 0.46 (0.02) 517.47 (220.96) 1451.53 (590.67) 0.35 (0.02) 1751.17 (242.31) 604.67 (71.86) 384.23 (69.31) 1220.67 (136.78) 1715.90 (236.29) 8054.97 (876.04)
PHI 3124.44 (522.83) 7012.01 (900.01) 0.44 (0.04) 327.20 (241.55) 975.73 (681.18) 0.32 (0.04) 1796.84 (266.13) 712.74 (86.02) 444.24 (106.87) 1374.85 (240.37) 1866.73 (239.09) 8253.84 (1171.70)
PHO 3343.47 (335.39) 7078.53 (628.76) 0.47 (0.02) 412.55 (267.35) 1161.08 (704.60) 0.33 (0.05) 2019.41 (257.41) 687.83 (120.12) 395.65 (67.59) 1358.43 (246.22) 1864.35 (224.91) 8687.27 (818.06)
POR 3257.51 (384.89) 6984.41 (701.97) 0.47 (0.02) 391.50 (258.22) 1109.97 (684.08) 0.33 (0.06) 1914.29 (259.05) 666.41 (118.46) 403.39 (53.52) 1323.61 (239.78) 1849.53 (238.99) 8471.57 (885.25)
SAC 3157.23 (509.71) 7019.83 (832.66) 0.45 (0.03) 373.48 (227.03) 1053.67 (597.75) 0.33 (0.05) 1854.15 (272.21) 672.85 (93.68) 374.96 (65.05) 1342.78 (197.03) 1915.52 (252.62) 8247.46 (1141.10)
SAS 3306.92 (407.50) 6968.52 (766.57) 0.47 (0.02) 321.49 (249.86) 892.57 (628.14) 0.33 (0.06) 1915.98 (278.52) 653.93 (110.40) 463.37 (91.99) 1306.88 (226.79) 1813.58 (294.27) 8592.27 (925.93)
TOR 2958.46 (359.04) 6568.75 (677.11) 0.45 (0.02) 550.17 (191.33) 1524.00 (508.61) 0.36 (0.02) 1729.17 (227.96) 606.25 (87.52) 411.42 (91.87) 1130.08 (143.40) 1749.54 (178.95) 7925.75 (984.27)
UTA 3156.11 (344.55) 6677.38 (670.47) 0.47 (0.02) 308.15 (233.35) 880.75 (635.06) 0.33 (0.04) 1986.71 (247.32) 670.29 (81.73) 450.04 (101.36) 1348.71 (204.85) 1914.16 (215.83) 8301.36 (771.99)
WAS 3284.17 (356.45) 7211.33 (768.70) 0.46 (0.02) 332.12 (242.25) 972.02 (642.85) 0.31 (0.06) 1825.72 (237.61) 647.72 (82.04) 404.37 (84.29) 1295.04 (182.54) 1852.90 (181.92) 8429.12 (810.86)

Plots

Passes Made

Number of passes made each season per team:

Doesn’t look like there’s much here, but we’ll see.

Assists

Raw assist numbers by team and season:

I forgot about the lockout seasons in 1998 and 2011, so I’ll have to look at percentages or exclude those years. However, suggests that my data scraping function worked correctly, which is good because it took forever. It does look like there could be an overall sinusoid trend though, which is interesting.

Next, I plotted the percentage of baskets assisted. This time I also split the plot into individual teams:

These plots look a little bit flatter to me, but there could still be an up and down trend. It would be worth checking for at least a cubic effect of time. Two random interesting things that stood out to me are the assist trends for the Utah Jazz and Golden State Warriors:

Golden State has a sudden increase in assist percentage around 2012, which is close to when they began their dominant run. The numbers peak in 2016, when Stephen Curry was the unanimous MVP. In Utah, the percentage of assisted baskets is consistently high from about 1985 to the early 2000s, which corresponds with the career of John Stockton (the NBA’s all-time leader in assists).

Because line graphs can be messy and hard to read, I tried plotting using Loess smoothing as well:

These are a little messy still, but the up-then-down trend is pretty obvious in the league-wide plot.

Models

Passing

I’m starting out with a very basic model, to see if overall passing has has changed since 2013. I wondered if it would be necessary to adjust for minutes played, given that you’d expect this to affect the number of passes. However, there was no association and models adjusting for minutes played were no better by AIC. So, the models below have a single fixed effect for season. I’m including a random intercept for team, but I’d like to check whether or not I should include an AR(1) structure for the repeated measures as well.

passing_mod <- lme(Passes.Made ~ Season, random = ~1|Team,
                   data = passing,method = "ML")
passing_mod_ar1 <- lme(Passes.Made ~ Season, random = ~1|Team,
                       data = passing,correlation = corAR1(),method = "ML")

The model with an AR(1) structure is better by AIC and the residuals look slightly better as well. There might be a sort of pattern in the standardized residuals for both models, but the AR(1) looks a little better.

df AIC
passing_mod 4 3159.781
passing_mod_ar1 5 3120.225

I wanted to try a locally smoothed model as well (using the smallest span parameter that didn’t produce a warning):

passing_loess <- loess(Passes.Made ~ Season, data = passing, span = 0.51)

I think the AR(1) and Loess residuals look pretty comparable, and since I’m not sure how to interpret a Loess model, I think I’ll stick with the AR(1) model. Based on the AR(1) model (refit using REML), it appears that the number of passes made hasn’t changed significantly over time:

term estimate std.error statistic p.value
(Intercept) 12685.885285 170288.21261 0.0744966 0.9407152
Season 5.744868 84.48924 0.0679953 0.9458806

Since there could potentially be a cubic trend in the residuals by season, I tested up to a quartic polynomial as well:

term estimate std.error statistic p.value
(Intercept) 24349.98889 235.8347 103.2502444 0.0000000
poly(Season, 4)1 -40.36199 2004.5104 -0.0201356 0.9839627
poly(Season, 4)2 -1941.54927 1404.4988 -1.3823787 0.1689665
poly(Season, 4)3 360.02024 1088.7414 0.3306756 0.7413636
poly(Season, 4)4 -465.82876 925.7304 -0.5032013 0.6155811

Still nothing, so I think it’s safe to say that total passing rate hasn’t changed significantly since 2013.

Percentage of baskets assisted:

Again, I’m starting out with a very basic model, to see if the percentage of baskets assisted has changed over time. This data goes all the way back to 1976, so there should be significantly more information than for raw passing numbers. This time I’d like to compare the spatial power correlation structure as well:

ast_mod <- lme(AST_perc ~ Season, random = ~1|Team,
                   data = all_seasons[all_seasons$Season > 1976,], method = "ML")
ast_mod_ar1 <- lme(AST_perc ~ Season, random = ~1|Team,
                   data = all_seasons[all_seasons$Season > 1976,], 
                   method = "ML",correlation = corAR1())
ast_mod_car1 <- lme(AST_perc ~ Season, random = ~1|Team,
                   data = all_seasons[all_seasons$Season > 1976,], 
                   method = "ML",correlation = corCAR1())
df AIC
ast_mod 4 6427.779
ast_mod_ar1 5 5855.183
ast_mod_car1 5 5855.183

The AR(1) structure and spatial power are better by AIC, so to keep things simple I’ll go with the AR(1) model. Now compare its residuals to the random intercept only model:

AR(1) residuals look a little bit better, but there still appears to be a pattern, so let’s test a model with up to a quartic polynomial for season:

ast_mod_ar1_poly <- lme(AST_perc ~ poly(Season,4), random = ~1|Team,
                   data = all_seasons[all_seasons$Season > 1976,], 
                   method = "ML",correlation = corAR1())
df AIC
ast_mod_ar1 5 5855.183
ast_mod_ar1_poly 8 5832.619

This is much better by AIC, so let’s look at the results (model re-fit with REML):

term estimate std.error statistic p.value
(Intercept) 59.43919 0.266882 222.717083 0.0000000
poly(Season, 4)1 -16.68293 7.535167 -2.214009 0.0270301
poly(Season, 4)2 -24.11999 7.087531 -3.403158 0.0006898
poly(Season, 4)3 25.99649 6.265169 4.149368 0.0000359
poly(Season, 4)4 12.53635 5.829033 2.150674 0.0317166

There appears to be a quartic trend for time in the percentage of baskets assisted!

Next steps

There’s still a lot to do for this project, but I didn’t want this phase 2 report to get even longer than it already is. Next I’d like to test how the percentage of assisted baskets affects winning percentage. I know now that there’s a quartic affect of time on assist percentage, but need to look into additional covariates as well. Obviously offense is only half of the game, so I imagine I’ll need to adjust for team defensive statistics. Counting steals and blocks isn’t the ideal way to measure defense though, so I may need to get additional data on more advanced stats like defensive rating. But I think this is a good start!